<?php
    class Operador extends BaseModel
    {  
        protected $operadorid;
        protected $login;
        protected $senha;
        protected $usuario;
        protected $empresaid;
        protected $orgaoid;
        protected $perfilid;
        protected $nucleogestorid;
        protected $ativo;

        const tablename = 'operadores';
        const tablekey = 'operadorid';
        const tablesequence = 'operadores_operadorid_seq';
        
        const ERRO_OPERADOR_LOGIN_ATIVO = 2;
        const ERRO_OPERADOR_LOGIN_INATIVO = 3;
        
        public function getVagaFilterSQL()
        {
            $contratosFilter = $this->getContratoFilterSQL();
            
            //Por default, vem todos
            $sql = 'vagaid';
            
            if ($contratosFilter) {
                $sql = 'SELECT vagaid FROM ' . Vaga::tablename . '
                    WHERE contratoid IN (' . $contratosFilter . ')';
            }  
            return $sql;
        }
        
        public function getContratoFilterSQL()
        {
            global $pfcid;
    
            $sql = "";
            
        	if ($pfcid !== NULL) {
        		
        	    switch ($pfcid) {
        		    case PerfilComportamental::Gabinete:
        		        $sql = "select contratoid from contratos ";
        		        break;
        		    
    				case PerfilComportamental::NucleoGestor: // Orgão Gestor
    					$id = $this->orgaoid;
    					if ($id) {
    					    $sql = "select contratoid from contratos WHERE 
    					       orgaoid = $id";
    					}
    				break;
    				
    				case PerfilComportamental::Empresa: // Empresa
    					$id = $this->empresaid;
    					if ($id) {
    					    $sql = "select contratoid from contratos WHERE 
    					       empresaid = $id";
    					} else {
                            $sql = '-1';
                        }
    				break;
    				
    				case PerfilComportamental::Orgao: // Orgao
    				    $id = $this->orgaoid;
    				    if ($id) {
    				        $sql = "select contratoid from contratos WHERE 
    				            orgaoid = $id";
    				    }
    				break;
    				
    				default:						
    				break;
        		}
            }
            return $sql;
        }
        
        public function listarContratos(){
        	$contratos = TUtils::CriarResultSet($this->getContratoFilterSQL());
        	return $contratos;
        }
        
         
        public function isContratoPermitido($contratoid){
        	global $usuario;
        	$flag =false;
        	
        	if ($usuario->isAuthorized('CONTRATOS/CADASTRAR CONTRATO')){
        		return true;
        	}
        	
        	$perfil = new Perfil($this->perfilid);        	
	        if (!is_null($perfil->perfilcomportamentalid)){
        		if (!is_null($contratoid)){
        			$sql = "select * from contratos WHERE contratoid = $contratoid ";
        			switch( $perfil->perfilcomportamentalid ):
										
						case PerfilComportamental::NucleoGestor: // Orgão Gestor
							$id = $this->orgaoid;
							$sql .= " AND orgaoid = $id";
						break;
						
						case PerfilComportamental::Orgao: // Orgão Gestor
							$id = $this->orgaoid;
							$sql .= " AND orgaoid = $id";
						break;
						
						case PerfilComportamental::Empresa: // Empresa
							$id = $this->empresaid;
							$sql .= " AND empresaid = $id";
						break;
						
						default:
							
						break;
						
					endswitch;
					
					$contratos = TUtils::CriarResultSet($sql);
					if (pg_num_rows($contratos)>0){
						$flag = true;
					}
					
        		}
        	}
        	return $flag;
        	
        }
        
        /**
         * @param $vagaid
         * @return boolean
         */
        public function isVagaPermitida($vagaid)
        {
        	$pfcid = $this->getPerfil()->perfilcomportamentalid;        	   	       
			switch( $pfcid ){								
				case PerfilComportamental::NucleoGestor: 
					$sql = 'SELECT v.vagaid FROM vaga v JOIN lotacoes l ON l.lotacaoid = v.lotacaoid WHERE v.vagaid='.$vagaid.' AND l.nucleogestorid ='. $this->nucleogestorid;
					$result = TSqlSelect::customSelect($sql);
					if (pg_num_rows($result) > 0){
					    return TRUE;
					}
				    break;							
				default:
				    // pega os contrato desse orgaoid
				    $contratos = $this->listarContratosSQL();
				    $vaga = new Vaga();
					$criterio['precondicao'] = 'vagaid ='. $vagaid .'  AND contratoid in (' . $contratos .')';
					$result = $vaga->listar($criterio);
			        if (pg_num_rows($result) > 0) {
					    return TRUE;
					}
				    break;				
			}
			return FALSE;			      	
        }
        
        public function getLotacoesFilterSQL()
        {
            global $usuario, $pfcid;
    
            $sql = "";
            
        	if ($pfcid !== NULL) {
        		switch ($pfcid){
        		    case PerfilComportamental::Gabinete:
        		        $sql = 'lotacaoid';
        		        break;
        		        
        		    case PerfilComportamental::NucleoGestor:
    					$id = $usuario->nucleogestorid;
    					if ($id) {
    					    $sql = 'SELECT lotacoes.lotacaoid 
    					    		FROM lotacoes 
    					    		WHERE lotacoes.nucleogestorid = ' . $id;
    					} else {
                            $sql = '-1';
                        }
                    break;
    				
    				case PerfilComportamental::Orgao:
    				    $id = $usuario->orgaoid;
    				    if ($id) {
    				        $sql = 'SELECT lotacoes.lotacaoid 
    					    		FROM lotacoes 
    					    		WHERE lotacoes.orgaoid = ' . $id;
    				    } else {
    				        $sql = '-1';
    				    }
    				break;
    				
    				default:
    				    $sql = '-1';
    				    break;
    			}
            }
            return $sql;
        }
        
        public function isLotacaoPermitida($lotacaoid)
        {
            global $usuario, $pfcid;

            $lotacao = new Lotacao($lotacaoid);
            
            if (!$lotacao->getTableKeyValue()) {
                return TRUE;
            }
            
            if ($pfcid !== NULL) {
        		switch ($pfcid){
        		    case PerfilComportamental::Gabinete:
        		        return TRUE;
        		        break;
        		        
        		    case PerfilComportamental::NucleoGestor:
    					$id = $usuario->nucleogestorid;
    					if ($id AND $lotacao->nucleogestorid == $id) {
    					    return TRUE;
    					}
    				    break;
    				
    				case PerfilComportamental::Orgao:
    				    $id = $usuario->orgaoid;
    				    if ($id AND $lotacao->orgaoid == $id) {
    					    return TRUE;
    					}
    				    break;
    			}
            }
            return FALSE;
        }
        
        /**
         * Lista os terceirizados que o usuário tem acesso sobre
         * @return string
         */
        public function getTerceirizadosFilterSQL()
        {
            global $usuario, $pfcid;
            
            $sql = 'SELECT cv.candidatoid FROM candidatovaga cv, vaga v, contratos c 
					WHERE cv.candidatoid = candidato.candidatoid 
					AND cv.vagaid = v.vagaid 
					AND v.contratoid = c.contratoid';
            
            if ($pfcid == PerfilComportamental::Empresa) {
                $sql .= ' AND c.empresaid = ' . $usuario->empresaid;
            }
            
            if ($pfcid == PerfilComportamental::Orgao OR $pfcid == PerfilComportamental::NucleoGestor) {
                $sql .= ' AND c.orgaoid = ' . $usuario->orgaoid; 
    	    }
    	    
    	    return $sql;
        }
        
        /**
         * Lista os candidatos que o usuário tem acesso sobre
         * @return string
         */
        public function getCandidatosFilterSQL()
        {
            global $usuario, $pfcid;
            
            $sql = '';
            
            $sql = 'SELECT sc.candidatoid FROM selecoescandidatos sc, selecoes s, vaga v, contratos c 
    				WHERE sc.candidatoid = candidato.candidatoid
    				AND sc.selecaoid = s.selecaoid 
    				AND s.vagaid = v.vagaid 
    				AND v.contratoid = c.contratoid';
    
            if ($pfcid == PerfilComportamental::Empresa) {
                $sql .= ' AND c.empresaid = ' . $usuario->empresaid;
            }
            
            if ($pfcid == PerfilComportamental::Orgao OR $pfcid == PerfilComportamental::NucleoGestor) {
                $sql .= ' AND c.orgaoid = ' . $usuario->orgaoid; 
    	    }
            
            return $sql;
        }
        
        public function isAuthorized($operacao)
        {
        	$permissao = new Permissao();
        	return $permissao->isAuthorized( $this->perfilid, $operacao );
        }
        
    	public function isAuthorizedMenu($menu)
    	{
        	$permissao = new Permissao();
        	return $permissao->isAuthorizedMenu( $this->perfilid, $menu );
        }
        
        /**
         * Autorizacao View
         * @param $operacao
         * @return unknown_type
         * @deprecated Substituir gradualmente pelo o método: isAuthorizedViewOperacao
         */
        public function isAuthorizedView($operacao) 
        {
        	if (!is_array($operacao)) {
        		if (!$this->isAuthorized($operacao)) {
        			header('location:../../view/home/index.php?method=unauthorized');
        		}
        	}
        	else {
        		$is_authorized = FALSE;
        		foreach ( $operacao as $o )
        			if ( $this->isAuthorized( $o ) )
        				$is_authorized = TRUE;
        		if ( $is_authorized === FALSE )
        			header('location:../../view/home/index.php?method=unauthorized');
        	}
        }
        
    	/**
         * Redirecionar : Autorização negada.
         * @return void
         */
        public function redirectUnauthorized(){
        	header('location:../../view/home/index.php?method=unauthorized');
        }
        
        /**
         * Autorização
         * @param $operacao
         * @param $redirect
         * @param $conector
         * @return boolean
         */
     	public function isAuthorizedViewOperacao( $operacao, $redirect = true, $conector = 'OR'){
        	if ( !is_array( $operacao ) ){
        		 $is_authorized = $this->isAuthorized( $operacao );
        	}
        	else {
        		       		
        		#OR
        		if ($conector == 'OR'){
        			$is_authorized = FALSE;
        			foreach ( $operacao as $o )
        				if ( $this->isAuthorized( $o ) )
        					$is_authorized = TRUE;
        		}
        		#AND
        		else{
        			$is_authorized = TRUE;
        			foreach ( $operacao as $o )
        				if ( !$this->isAuthorized( $o ) )
        					$is_authorized = FALSE;
        		}  		
        	}
        	
        	if($redirect and !$is_authorized){
        		$this->redirectUnauthorized();
        	}
       		else{
       			return $is_authorized;
       		}
        }
        
        /** 
         * @return Perfil
         */
        public function getPerfil(){
        	return new Perfil($this->perfilid);
        }
        
    	/** 
         * @return Empresa
         */
        public function getEmpresa(){
        	return new Empresa($this->empresaid);
        }        
        
        public function getOrgao(){
            return new Orgao($this->orgaoid);
        }
        
        /**
         * Verifica se o login do operador ja existe no sistema.
         * Observando tambem se o operador existente esta ativo ou inativo
         * @return TRUE | ERRO_OPERADOR_LOGIN_ATIVO | ERRO_OPERADOR_LOGIN_ATIVO
         */
        public function verificarLogin()
        {
        	#Pesquisar operadores com o mesmo login
        	$obj = new Operador();
        	
        	$criterio = array();
        	$criterio['campo'] = 'login';
        	$criterio['operador'] = 'like';
        	$criterio['valor'] = $this->login;
        	
        	#Caso Alterar
            if ($this->getTableKeyValue()){
                $criterio['precondicao'] = $this->getTableKey() . ' <> ' . $this->getTableKeyValue();
        	}
        	        	        	
        	$result = $obj->listar( $criterio );      	
        	if ( pg_num_rows( $result ) > 0 ){
        		$op =  pg_fetch_object($result);
        		if ( $op->ativo == 't' )
        			return self::ERRO_OPERADOR_LOGIN_ATIVO;
        		else
        			return self::ERRO_OPERADOR_LOGIN_INATIVO;        		
        	}        	
    		return TRUE;
        }
        
        public function cadastrar()
        {   
            if($this->perfilid == NULL OR $this->perfilid == 0){
                throw new Exception('Você deve escolher um PERFIL para o operador.');
            }                        
            $perfil = $this->getPerfil();
            
            switch($perfil->perfilcomportamentalid){
                case PerfilComportamental::Orgao:
                    if($this->orgaoid == NULL OR $this->orgaoid == 0){
                        throw new Exception('Você deve escolher um ORGÃO para o operador.');
                    }
                break;
                case PerfilComportamental::Empresa:
                    if($this->empresaid == NULL OR $this->empresaid == 0){
                        throw new Exception('Você deve escolher uma EMPRESA para o operador.');
                    }
                break;
                case PerfilComportamental::NucleoGestor:
                    if($this->orgaoid == NULL OR $this->orgaoid == 0){
                        throw new Exception('Você deve escolher um ORGÃO para o operador.');
                    }
                break;
            }           
            
            //Ativando Operador
            $this->ativo = TRUE;	    
            
            #Caso: Inserir
	        if ($this->operadorid === NULL){	            
		        $result = $this->verificarLogin();       	
		        if ($result === TRUE){
		            $this->senha = md5( $this->login );
	        		$this->salvar();
	        		 return TRUE;
	        	}	        	
	        	return $result;	        	
	        }    	
        	else{ 
        	    #Caso: Alterar
                if ($this->verificarLogin() !== TRUE){
                    throw new Exception ('O login informado já está sendo utilizado. Por favor, informe outro.');
                }       	    
                $this->salvar();
                return TRUE;
	        }
	        
        }
        
        public function reativar()
        {
        	$this->ativo = true;
        	$this->senha = md5($this->login);
        	$this->salvar();
        }
        
        public function desativar(){
        	$this->ativo = false;
        	$this->salvar();
        }
        
        
   		public function desativarGrupo( $operadorids )
        {
        	$sql = "UPDATE " . self::tablename . " SET ativo = false WHERE " . self::tablekey . " in (";
            for($i = 0; $i < count($operadorids); $i++)
            {
                $sql .= $operadorids[$i];
                if ($i < count($operadorids)-1)
                { $sql .= ","; }
                else
                { $sql .= ")"; }
            }
            
            pg_query(conexao::Conectar(), $sql) or die ("Erro ao excluir.");
        }

        public function resetarSenha(){
            $this->senha = md5($this->login);
            $this->salvar();
        }
        
        public function listarContratosSQL()
        {
            return $this->getContratoFilterSQL(); 
        }
        
        public function isSam()
        {
        	if ($this->isAuthorized(Operacao::CONTRATO_CADASTRAR)) {
        		return TRUE;
        	}
        }
        
    }
?>